home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / FREENET / BRODIE / INTERNET / !InternetD / c / echo < prev    next >
Text File  |  1995-06-06  |  2KB  |  66 lines

  1. /* echo.c - the echod for !InternetD */
  2.  
  3. #include "inetd.h"
  4.  
  5. #define ECHOSIZE    256
  6.  
  7. void echo_udp(int s)
  8. {
  9.         struct    sockaddr_in    address;
  10.         int    size        = sizeof(struct sockaddr_in);
  11.     char            echobuff[ECHOSIZE];
  12.     int    length;
  13.  
  14.     address.sin_addr.s_addr = INADDR_ANY;
  15.     length = recvfrom(s, echobuff, ECHOSIZE, 0, (struct sockaddr *)&address, &size);
  16.     if (length > 0) {
  17.             if (ioctl(s, FIONBIO, (char *)1) == -1) {
  18.                     syslog(0, "ioctl() failed for echo/udp");
  19.             }
  20.             sendto(s, echobuff, length, 0, (struct sockaddr *)&address, size);
  21.             if (ioctl(s, FIONBIO, NULL) == -1) {
  22.                     syslog(0, "ioctl() failed for echo/udp");
  23.             }
  24.     }
  25. }
  26.  
  27. void echo_tcp(int s)
  28. {
  29.         int             t;
  30.         struct sockaddr_in    address;
  31.     int            size = sizeof(struct sockaddr_in);
  32.     inet_handler        *ih;
  33.  
  34.         t = accept(s, (struct sockaddr *)&address, &size);
  35.         if (t == -1) return;
  36.  
  37.     ih = worker_register(t, echo_data, worker_io_read);
  38.     if (ih) {
  39.             if (ioctl(t, FIONBIO, (char *)1) == -1) {
  40.                     syslog(0, "ioctl() failed for echo/tcp");
  41.             }
  42.             syslog(0, "established echo/tcp connection");
  43.     }
  44.     else {
  45.             kill_socket(&t);
  46.     }
  47. }
  48.  
  49. void echo_data(inet_handler *ih, worker_io_flags f)
  50. {
  51.         char    data[ECHOSIZE];
  52.         int    result;
  53.  
  54.     UNUSED(f);
  55.         result = recv(ih->data_socket, data, ECHOSIZE, 0);
  56.         if (result == -1 && errno == EWOULDBLOCK) return;
  57.         if (result < 1) {
  58.                 worker_deregister(ih->data_socket);
  59.                 return;
  60.         }
  61.         result = send(ih->data_socket, data, result, 0);
  62.         if (result < 0 && errno != EWOULDBLOCK) {
  63.                 worker_deregister(ih->data_socket);
  64.         }
  65. }
  66.